﻿using MengLin.OOP.DesignPattern.Implement.MySql;
using MengLin.OOP.DesignPattern.Interface;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MengLin.OOP.DesignPattern.FactoryMethod
{
    /// <summary>
    /// 工厂类-框架
    /// 每一个工厂只负责创建1个对象
    /// 缺点：把对象的创建搞的更麻烦了，代码写的更多了
    /// 注意：这里我的动作是增加
    /// 价值在哪里？反而代码越写越多了
    /// 1.对扩展开放，对修改封闭(a.增加一个工厂类.b.增加一个实现类),不会对原来的代码造成影响
    /// 2.如果创建对象很复杂(把创建对象的细节屏蔽掉，上端不关心创建对象的条件)
    /// 3.工厂还可以覆写
    /// </summary>
    public class MySqlFactory: IFactory
    {
        /// <summary>
        /// 创建实例
        /// </summary>
        /// <returns></returns>
        //public IUserService CreateInstance()
        //{
        //    int[] array = new int[2];
        //    array[0] = 1;
        //    array[1] = 2;
        //    IUserService iUserService = new MySqlUserService(1, "管理员", array);//实现类

        //    return iUserService;
        //}

        /// <summary>
        /// 创建实例
        /// </summary>
        /// <returns></returns>
        public virtual IUserService CreateInstance()
        {
            int[] array = new int[2];
            array[0] = 1;
            array[1] = 2;
            IUserService iUserService = new MySqlUserService(1, "管理员", array);//实现类

            return iUserService;
        }
    }

    /// <summary>
    /// 自定义-扩展
    /// </summary>
    public class MySqlFactoryExtend : MySqlFactory
    {
        /// <summary>
        /// 创建实例
        /// </summary>
        /// <returns></returns>
        public override IUserService CreateInstance()
        {
            Console.WriteLine("这里是我们扩展的工厂");
            IUserService iUserService = base.CreateInstance();

            return iUserService;
        }
    }
}
